package com.qidian.buy.cart.service.impl;

import com.qidian.buy.cart.service.ICartService;
import com.qidian.buy.entity.Item;
import com.qidian.buy.entity.User;
import com.qidian.buy.util.JSONTools;
import com.qidian.buy.util.pojo.BuyResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author 戴着假发的程序员
 * @Company 起点编程
 * @date 2023/5/26 14:23
 */
@Service
public class CartServiceImpl implements ICartService {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private RestTemplate restTemplate;


    @Override
    public BuyResult addCart(User user, Long itemId, int count) {
        String key = "CART_" + user.getId();
        // 从reids中获取购物车信息
        String carJson = null;
        if (!(redisTemplate.hasKey(key) && !"".equals(carJson = redisTemplate.opsForValue().get(key)))) {
            // 购物车不存在
            // 创建新的购物车（list）
            List cart = new ArrayList();
            // 远程调用查询商品信息
            BuyResult buyResult = restTemplate.getForObject("http://buy-product/buy/item/detail?id=" + itemId, BuyResult.class);
            // 修改商品数量
            Map map = (Map) buyResult.getObj();
            Map item = (Map) map.get("item");
            item.put("num",count);
            // 将商品放入liset
            cart.add(item);
            //将list转换为json存入redis
            redisTemplate.opsForValue().set(key, JSONTools.object2json(cart));
        }else {
            // 购物车存在
            // 取出购物车
            List<Map> cart = JSONTools.json2list(carJson, Map.class);
            // 遍历购物车查看当前要添加的商品是否已经在购物车中
            boolean exists = false;
            for (Map item : cart){
                if(item.get("id").toString().equals(itemId+"")){
                    exists = true;
                    //  修改购物车中商品的数量，
                    int num = Integer.parseInt(item.get("num").toString());
                    num += count;
                    item.put("num",num);
                    break;
                }
            }
            if(!exists) {
                //  如果不存在，就远程调用查询商品，并且将商品放入list中
                // 将list再次写入redis
                // 远程调用查询商品信息
                BuyResult buyResult = restTemplate.getForObject("http://buy-product/buy/item/detail?id=" + itemId, BuyResult.class);
                // 修改商品数量
                Map map = (Map) buyResult.getObj();
                Map item = (Map) map.get("item");
                item.put("num",new Integer(item.get("num").toString())+count);
                // 将商品放入liset
                cart.add(item);

            }
            //将list转换为json存入redis
            redisTemplate.opsForValue().set(key, JSONTools.object2json(cart));
        }
        // 返回
        return BuyResult.ok();
    }

    @Override
    public BuyResult updateCart(User user, Long itemId, int count) {
        String key = "CART_" + user.getId();
        // 从reids中获取购物车信息
        String carJson = null;
        if (redisTemplate.hasKey(key) && !"".equals(carJson = redisTemplate.opsForValue().get(key))) {
            List<Map> cart = JSONTools.json2list(carJson, Map.class);
            // 遍历cart，修改商品数量
            for (Map item : cart){
                if(item.get("id").toString().equals(itemId+"")){
                    //  修改购物车中商品的数量，
                    item.put("num",count);
                    //将list转换为json存入redis
                    redisTemplate.opsForValue().set(key, JSONTools.object2json(cart));
                    return BuyResult.ok();
                }
            }
        }
        return BuyResult.fal("购物车不存在");
    }

    @Override
    public BuyResult deleteCart(User user, Long itemId) {
        String key = "CART_" + user.getId();
        // 从reids中获取购物车信息
        String carJson = null;
        if (redisTemplate.hasKey(key) && !"".equals(carJson = redisTemplate.opsForValue().get(key))) {
            List<Map> cart = JSONTools.json2list(carJson, Map.class);
            // 遍历cart，修改商品数量
            for (Map item : cart){
                if(item.get("id").equals(item)){
                    cart.remove(item);
                    return BuyResult.ok();
                }
            }
        }
        return BuyResult.fal("购物车不存在");
    }

    @Override
    public BuyResult list(User user) {
        String key = "CART_" + user.getId();
        // 从reids中获取购物车信息
        String carJson = null;
        if (redisTemplate.hasKey(key) && !"".equals(carJson = redisTemplate.opsForValue().get(key))) {
            List<Map> cart = JSONTools.json2list(carJson, Map.class);
            for (Map item : cart){
                item.put("image",item.get("image").toString().split(";"));
            }
            return BuyResult.ok(cart);
        }
        return BuyResult.fal("购物车不存在");
    }
}
